<?php

namespace app\shop\controller;
// 引入类
use app\common\library\VerifyCodeManager;
use think\Controller;
use app\common\library\Email;
class User extends Controller
{
    //构造函数
    public function __construct()
    {
        parent::__construct();
        //加载模型
        $this->userModel = model('common/User/User');
    }

    // 登录功能
    public function login(){
        if($this->request->isPost()){
            // 获取前端传过来的username 和 password的值  --trim是清除前后空格
            $username=$this->request->param('username','','trim');
            $password=$this->request->param('password','','trim');
            // halt($username.'666');
            // 判断username和密码不为空
            if($username===''){
                $this->error('用户名为不能为空');
                exit;
            }elseif ($password==='') {
                $this->error('密码为不能为空');
                exit;
            }elseif(!preg_match('/^1[3-9]\d{9}$/', $username)){
                //正则表达式
                $this->error('手机号码格式不对');
                exit;
            }else{
                // $this->error('密码为不能为空');
                // 查询账号
                $busresult=$this->userModel->where('mobile',$username)->find();
                // halt($busresult);
                if($busresult===NULL){
                    $this->error('该账号不存在');
                    exit;
                }else{
                    $salt=$busresult['salt'];
                    $userpassword=$busresult['password'];
                    $inputpassword=md5($password.$salt);
                    if($userpassword==$inputpassword){
                            unset($busresult['salt']);
                            unset($busresult['password']);
                            $this->success('登录成功',null,$busresult);
                            exit;
                        }else{
                            $this->error('密码错误');
                            exit;
                        }
                }
            };

        }else{
            $this->error('请求错误');
        }
    }


    // 注册功能
    public function register(){
        if($this->request->isPost()){
            // 获取前端的数据
            $username=$this->request->param('username','','trim');
            $password=$this->request->param('password','','trim');
            /**
             * param(string $name, mixed $default = null, mixed $filter = '')
             * 1.$name（必填）
             * 类型：字符串
             * 含义：要获取的参数名（对应 URL 参数、表单字段名或 JSON 键名）。
             * 2.$default（可选，默认 null）
             * 类型：任意类型
             * 含义：当请求中不存在该参数时返回的默认值。
             * 3.$filter（可选，默认空字符串）
             * 类型：字符串 | 数组 | 回调函数
             * 含义：对参数值进行过滤或处理的规则。
             */
            $confirmPassword=$this->request->param('confirmPassword','','trim');
            $emails=$this->request->param('email','','trim');
            $sendcode=$this->request->param('sendcode','','trim');

            // print_r($password.'===='.$confirmPassword);
            // halt($confirmPassword.'99999999');
            // 判断都不为空

            
            if ($username==='') {
                $this->error('手机号不能为空');
                exit;
            }elseif ($password==='' || $confirmPassword==='') {
                $this->error('密码不能为空');
                exit;
            }elseif ($password!==$confirmPassword) {
                $this->error('密码不一致');
                exit;
            }elseif(!preg_match('/^1[3-9]\d{9}$/', $username)){
                $this->error('手机号码格式不对');
                exit;
            }else{
                $dataMobile=[
                    'mobile'=>$username,
                ];
                // $user = new User();
                // 查询单个数据
                $mobileResult = $this->userModel->get($dataMobile);
                $emailResult = $this->userModel->get(['email'=>$emails]);
                // halt($mobileResult);
                // 如果查到该手机号，则提示已被注册
                if($mobileResult!==NULL){
                    $this->error('该手机号已被注册');
                    exit;
                }
                if($emailResult !==NULL){
                    $this->error('该邮箱已被绑定');
                    exit;
                }
                // 先判断验证码是否正确
                // // 创建实例
                $codeManager = new VerifyCodeManager();
                // // 这里是封装了一个方法,存Redis里面
                $res =  $codeManager->verifyEmailCode((string)$emails, (string)$sendcode);
                // halt($res);
                if(!$res){
                    $this->error('验证码错误');
                    exit;
                }
                // $res = $codeManager->setEmailCode((string)$emails, (string)$sendcode);
                //获取随机盐---generateSalt()这个方法在common.php里（被封装）
                $salt = generateSalt();
                $newPwd = md5($password.$salt);
                $data = [
                    'mobile'=>$username,
                    'nickname'=>$username,
                    'password'=>$newPwd,
                    'email'=>$emails,
                    'salt'=>$salt,
                    'createtime'=>time()
                ];
                // 插入数据
                $bsResult=$this->userModel->save($data);
                if($bsResult){
                    $this->success('注册成功');
                    exit;
                }else{
                    $this->error('注册失败');
                    exit;
                }
            }

        }
    }

    // 发送验证码
    public function sendCode(){
        if($this->request->isPost()){
            $emails=$this->request->param('email','','trim');
            if($emails ==''){
                $this->error('邮箱不能为空');
                exit;
            }
            $getEmailRes = $this->userModel->get(['email'=>$emails]);
            // halt($getEmailRes);
            if(!empty($getEmailRes)){
                $this->error('邮箱已被绑定，请更换其他邮箱');
                exit;
            }
            // if()
            $row = [
                'mail_type'=>config('site.mail_type'),
                'mail_smtp_host'=>config('site.mail_smtp_host'),
                'mail_smtp_port'=>config('site.mail_smtp_port'),
                'mail_smtp_user'=>config('site.mail_smtp_user'),
                'mail_smtp_pass'=>config('site.mail_smtp_pass'),
                'mail_verify_type'=>config('site.mail_verify_type'),
                'mail_from'=>config('site.mail_from'),
            ];
            $sendcode = generateSalt();
            $html = "<div>您的验证码为：$sendcode</div>";
            // halt($salt);
            \think\Config::set('site', array_merge(\think\Config::get('site'), $row));
            $email = new Email;
            $result = $email
                ->to($emails)
                ->subject('fan商城验证')
                ->message($html)
                ->send();
            // halt($result);
            if ($result) {
                // 创建实例
                $codeManager = new VerifyCodeManager();
                // 这里是封装了一个方法,存Redis里面
                $res = $codeManager->setEmailCode((string)$emails, (string)$sendcode);
                if($res){
                    $this->success('发送验证码成功');
                    exit;
                }  
            } else {
                $this->error($email->getError());
                exit;
            }

        }
    } 


    
    
    

//     public function index()
//     {
//         $content = "hello world";

//         //赋值数据到页面模板
//         $this->assign('content', $content);
        
//         //渲染页面模板
//         return $this->view->fetch();
//     }

//     // 新增数据
//     public function add()
//     {
//         if($this->request->isPost())
//         {
//             //接收所有参数
//             $params = $this->request->param();

//             //插入数据库
//             $result = true;

//             if($result)
//             {
//                 //成功跳转函数
//                 $this->success('新增成功', url('home/demo/index'));
//                 exit;

//                 //或者直接重定向跳转不提醒
//                 // $this->redirect('home/demo/index');
//                 // exit;
//             }else
//             {
//                 //失败跳转函数
//                 $this->error('新增失败');
//                 exit;
//             }
//         }

//         return $this->view->fetch();
//     }

//     // 请求对象
//     public function info()
//     {
//         // 获取当前域名
//         echo '域名: ' . $this->request->domain() . '<br/>';

//         // 获取当前URL地址 不含域名
//         echo 'URL地址: ' . $this->request->url() . '<br/>';

//         //获取控制器名称
//         echo "当前模块名称是：" . $this->request->module() . '<br/>';
//         echo "当前控制器名称是：" . $this->request->controller() . '<br/>';
//         echo "当前操作名称是：" . $this->request->action() . '<br/>';


//         //判断请求类型 (isGet/isPost/isAjax/isMobile)
//         if($this->request->isAjax())
//         {
//             // 接收方法 param/get/post/file/server/cookie/session

//             //接收所有参数
//             $params = $this->request->param();

//             //接收单个参数
//             $username = $this->request->param('username', '', 'trim');
//         }
        
//     }

}

// 生成密码盐
function generateSalts() {
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt = '';
    
    for ($i = 0; $i < 6; $i++) {
        $salt .= $chars[random_int(0, strlen($chars) - 1)];
    }
    
    return $salt;
}

?>

